package com.reder.practice.common.util;

import org.springframework.util.DigestUtils;

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
import java.util.UUID;

/**
 * 编码相关的工具类
 *
 * @author Fish
 * ------ 1149062639@qq.com
 * created by 2018/11/14 15:42:35
 */
public final class CodeUtil {

    private CodeUtil() {
    }

    /**
     * 判断字符串是否为空
     * 这里的空是指 null 或者是 "" 或者是 "   "
     *
     * @param str 要被判断的字符串
     * @return true 字符串为空，false 不为空
     */
    public static boolean isBlank(String str) {
        return (str == null || str.trim().length() == 0);
    }

    /**
     * 得到 MD5 加密之后的值
     *
     * @param str  要被加密的串
     * @param salt 加密的盐值，如果为空串就不设置
     * @return 返回 MD5 加密之后的值
     */
    public static String md5(String str, String salt) {

        // 如果不设置盐值
        if (isBlank(salt)) {
            return DigestUtils.md5DigestAsHex(str.getBytes());
        }

        // 这样的加盐方式需要斟酌，数据库是有盐值的，也就说盐值是知道的
        return DigestUtils.md5DigestAsHex((salt + str + salt).getBytes());
    }

    /**
     * 得到 MD5 加密之后的值
     *
     * @param str 要被加密的串
     * @return 返回 MD5 加密之后的值
     */
    public static String md5(String str) {
        return md5(str, null);
    }

    /**
     * 获取最大长度为 maxLength 的随机字符串
     *
     * @param maxLength 最大长度，返回的字符串不一定就是 maxLength 这么长
     * @return 返回随机生成的字符串
     */
    public static String randomString(int maxLength) {
        String randomString = UUID.randomUUID().toString().replaceAll("-", "");
        if (randomString.length() > maxLength) {
            randomString = randomString.substring(0, maxLength);
        }

        return randomString;
    }

    /**
     * 使用 UTF8 解码字符串
     *
     * @param str 原始字符串
     * @return 返回解码成功的，抛出异常就返回原始字符串
     */
    public static String decode(String str) {
        try {
            return URLDecoder.decode(str, "UTF8");
        } catch (UnsupportedEncodingException e) {
            return str;
        }
    }
}
